iT邦幫忙

2022 iThome 鐵人賽

DAY 30
0
Software Development

2022年 JavaScript 相關應用及學習之繁體中文選系列 第 30

[2022年 JavaScript 相關應用及學習之繁體中文選] 程式設計師的自我修養 | 心得導讀

  • 分享至 

  • xImage
  •  

導言

本是主要是 C++ 為主要語法,詐聽之下,好像跟 js 沒有任何關係,但事實上, js 在前端 browser 的 runtime v8engine 和後端 node.js 的 runtime 都是由 C++ 所撰寫的。

架構

第1篇 簡介

第1章 溫故而知新:介紹基本的背景知識,包括硬體、作業系統、鍺程等。

第2篇 靜態連結

第2章 編譯和連結:介紹編譯和連結的基本概念和步驟。
第3章 剖析目的檔:介紹 COFF目的檔格式和原始碼編譯後如何在目的檔中儲存。
第4章 靜態連結:介紹靜態連結與靜態程式庫連結的過程和步驟。
第5章 Windows PE/COFF:介紹 Windows 平台的目的和可執行檔格式。

第3篇 載入與動態連結

第6章 可執行檔的載入與行程:介紹行程的概念、行程位址空間的配置和可執行檔載入過程。
第7章 動態連結:以Linux下的.so 共用程式庫為基礎詳細分析了動態連結的過程。
第8章 Linux共用程式庫的組織:介紹 Linux下共用程式庫檔案的分佈和組織。
第9章 Windows 下的動態連結:介紹 Windows 系統下 DLL 動態連結機制。

第4篇 程式庫與執行階段程式庫

第10章 記憶體:主要介紹堆積與堆疊,堆積的分配演算法,函式呼叫堆疊配置。
第11章 執行階段程式庫:主要介紹執行階段程式庫的概念、C/C++執行階段程式庫、Glibe 和MSVC CRT、執行階段程式庫如何實作C++全域建構和解構及以fread()庫函式 為例對執行階段程式庫進行剖析。
第12章 系統呼叫與API:主要介紹 Linux 和 Windows 的系統呼叫及Windows 的API
第13章 實作執行階段程式庫:主要實作了一個支援堆積、基本檔案操作、格式化字串、 基 本輸入輸出、C++new/delete、C++string、C++全域建構和解構的Mini CRT

摘要

同步與鎖定

為了避免多個緒程同時讀寫同一資料而產生不可預料的後果,我們要同步 (Synchronization)各個緒程存取同一資料。所謂同步,即指在一個緒程存取資料未結束的 時候,其他緒程不得存取同一個資料。如此,對資料的存取即可原子化。
同步的最常見方法是鎖定(Lock).鎖定是一種非強制機制,每一個緒程在存取資料或資源之前首先試圖獲取(Acquire)鎖定,並在存取結束之後釋放(Release)鎖定。在鎖定已經被佔用的時候試圖獲取鎖定時,緒程會等待,直到鎖定重新可用。
二元旗號(Binary Semaphore)是最簡單的一種鎖定,它只有兩種狀態:佔用與非佔用。它適合只能被唯一一個緒程獨佔存取的資源。當二元旗號處於非佔用狀態時,第一個試圖獲取該二元旗號的緒程會獲得該鎖定,並將二元旗號設為佔用狀態,此後其他所有試圖獲取該二元旗號的緒程將會等待,直到該鎖定被釋放。
對於允許多個緒程同時存取的資源,多元旗號簡稱旗號(Semaphore),它是一個很好的選擇。一個初始值為 N 的旗號允許 N 個緒程同時存取。緒程存取資源的時候首先獲取旗號,進行如下操作。
將旗號的值減1。
如果旗號的值小於0,則進入等待狀態,否則繼續執行。

存取完資源之後,緒程釋放旗號,進行如下操作。
將旗號的值加1。
如果旗號的值小於1,喚醒一個等待中的緒程。

互斥器(Mutex)和二元旗號很類似,資源僅同時允許一個緒程存取,但和旗號不同的是,旗號在整個系統可以被任意緒程獲取並釋放,也就是說,同一個旗號可以被系統中的一 個緒程獲取之後,由另一個緒程釋放。而互斥器則要求哪個緒程獲取了互斥器,哪個緒程就要負責釋放這個鎖定,其他緒程越俎代庖去釋放互斥器是無效的。
關鍵區段(Critical Section)是比互斥器更加嚴格的同步手段。在術語中,把獲取關鍵區段的鎖定稱為進入關鍵區段,而把鎖定的釋放稱為離開關鍵區段。關鍵區段和互斥器與旗號的區別在於,互斥器和旗號在系統的任何行程裏都是可見的,也就是說,一個行程建立了一個互斥器或旗號,另一個行程試圖去獲取該鎖定是合法的。然而,關鍵區段的作用範圍僅限於該行程,其他的行程無法獲取該鎖定。除此之外,關鍵區段具有和互斥器相同的性質。
讀寫鎖定(Read-Write Lock)致力於一種更加特定場合的同步。對於一段資料,多個緒程同時讀取總是沒有問題的,但假設動作都不是原子型,只要有任何一個緒程試圖對這個資料進行修改,就必須使用同步方法來避免出錯。如果我們使用上述旗號,互斥器或關鍵區段中的任何一種來進行同步,儘管可以保證程式正確,但對於讀取頻繁,且僅僅偶爾寫入的情況,會顯得非常效率不彰。讀寫鎮定可以避免這個問題。對於同一個鎖定,讀寫鎖定有兩種獲取方式,共用(Shared)或獨佔(Exclusive)。當鎖定處於自由的狀態時,試圖以任何一種方式獲取鎖定都能成功,並將鎖定置於對應的狀態。如果鎖定處於共用狀態,其他緒程以共用的方式獲取鎖定仍然會成功,此時這個鎖定分配給了多個緒程。然而,如果其他緒程試圖以獨佔的方式獲取已經處於共用狀態的鎖定,那麼它將必須等待所有緒程釋放鎖定。 相應地,處於獨佔狀態的鎖定將阻止任何其他緒程獲取該鎖定,不論它們試圖以哪種方式獲取、讀寫鎖定的行為可以總結如表1–6所示。

總結

難易度

⭐⭐⭐⭐

自備技能

程式經驗

適合對象

中階以上

心得

如果你對於 JS 很多的靈異現象感到奇怪,那回到最初,學學 C++ 吧!追根究底、終身學習,這就是「程式設計師的自我修養」。


上一篇
[2022年 JavaScript 相關應用及學習之繁體中文選] 流量的秘密 | 心得導讀
下一篇
完賽感言:最好的安排
系列文
2022年 JavaScript 相關應用及學習之繁體中文選31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言